# 生成器是什么?
# 所以，如果列表元素可以按照某种算法推算出来，
# 那我们是否可以在循环的过程中不断推算出后续的元素呢？
# 这样就不必创建完整的list，从而节省大量的空间。
# 在Python中，这种一边循环一边计算的机制，称为生成器：generator。

# 怎么使用?
# 最简单的方式就是将列表生成式的方括号换位圆括号
g = (x * x for x in range(10))
print(g)

# 可以通过next不断获取里面的元素
print(next(g))
print(next(g))
print(next(g))
print('*' * 50)


# 复杂规则生成器定义和使用
# generator非常强大。如果推算的算法比较复杂，用类似列表生成式的for循环无法实现的时候，还可以用函数来实现。
def fib(max):
    n, a, b = 0, 0, 1
    while n < max:
        yield b
        a, b = b, a + b
        n = n + 1
    return 'done'


s = fib(7)
print(s)
print(next(s))
print(next(s))
print(next(s))
print(next(s))
